package br.com.hstar.client.produto.grupo;

import java.util.Iterator;
import java.util.List;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.util.FormPanel;
import br.com.hstar.client.util.HstarDialogBox;
import br.com.hstar.client.util.HstarUserException;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class GrupoEditPanel extends FormPanel {

	private Button incluir;
	private Button cancelar;
	private Button excluir;
	
	private TextBox nome;
	private ListBox grupoPai;
	private GrupoUI grupoUI;
	
	public GrupoEditPanel(String _title) {
		super(_title);
		grupoUI = new GrupoUI();
		init(true);
	}
	
	public GrupoEditPanel(String _title, Long id) {
		super(_title);
		grupoUI = new GrupoUI();
		grupoUI.setId(id);
		init(false);
		ServiceFactory.createGrupoService().retrieveById(id, new RetrieveAsyncCallback());
	}
	
	
	
	//Methods -------------------------------------------------------------------
	
	private void init(boolean isNew) {

		nome 	= addTextBox("Nome", 30, 30, "");
		grupoPai = addListBox("Grupo Pai", true);
		ServiceFactory.createGrupoService().listAll(new ListAllGrupoPaiAsyncCallback());
		
		if(isNew) {
			incluir  = addButton("Incluir");
			cancelar = addButton("Cancelar");
		} else {
			incluir  = addButton("Alterar");
			cancelar = addButton("Cancelar");
			excluir = addButton("Excluir");
			excluir.addClickListener(new ClickListener() {
				public void onClick(Widget sender) {
					ServiceFactory.createGrupoService().delete(grupoUI.getId(), new DeleteAsyncCallback());
				}
			});
		}
		
		incluir.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
					try {
						copyData();
						ServiceFactory.createGrupoService().saveOrUpdate(grupoUI, new SaveAsyncCallback());
					} catch (HstarUserException e) {
						new HstarDialogBox("Grupo", e.getMessage());
					}					
					
			}
		});
		cancelar.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				RootPanel.get("boxContent").clear();
				RootPanel.get("boxContent").add(new GrupoListPanel("Grupo"));
			}
		});
		
	}
	
	private void copyData() throws HstarUserException {
		
		if(nome.getText().trim() == "")
		{			
			throw new HstarUserException(" - Digite o nome do grupo <br>");
			
		}
		
		if(grupoPai.getSelectedIndex() > 0) {
			grupoUI.setGrupoPai(
					new GrupoUI(new Long(grupoPai.getValue(grupoPai.getSelectedIndex()))));
		} else {
			grupoUI.setGrupoPai(null);
		}
		grupoUI.setNome(nome.getText().trim());
	}

	// INNER CLASSES ----------------------------------------------------------------
	private class SaveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {			
			
			if(caught instanceof HstarUserException)
			{					
				new HstarDialogBox("Grupo de produtos",caught.getMessage());
			}
			
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new GrupoListPanel("Grupo"));
		}
	}
	
	private class DeleteAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Grupo edit panel");
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new GrupoListPanel("Grupo"));
		}
	}
	
	//carrega os campos. Usado para quando está editando
	private class RetrieveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Status do Andamento edit panel");
		}

		public void onSuccess(Object result) {
			grupoUI = (GrupoUI)result;

			nome.setText(grupoUI.getNome().toString().trim());
			
			if (grupoPai != null && grupoUI.getId() != null && grupoUI.getGrupoPai() != null) {
				for(int i = 0; i < grupoPai.getItemCount(); i++) {
					if(grupoPai.getItemText(i).equals(grupoUI.getGrupoPai().getValue(1))) {
						grupoPai.setSelectedIndex(i);
						break;
					}
				}
			}			
		}
	}
	
//	lista todos os clientes para colocar no listbox
	private class ListAllGrupoPaiAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO ao listar");
		}

		public void onSuccess(Object result) {
			List grupos = (List) result;
			for (Iterator iter = grupos.iterator(); iter.hasNext();) {
				GrupoUI grUI = (GrupoUI) iter.next();
				grupoPai.addItem(grUI.getNome(), grUI.getId().toString());
			}
			
			if(grupoUI != null){
				if (grupoPai != null && grupoUI.getId() != null && grupoUI.getGrupoPai() != null) {
					for(int i = 0; i < grupoPai.getItemCount(); i++) {
						if(grupoPai.getItemText(i).equals(grupoUI.getGrupoPai().getValue(1))) {
							grupoPai.setSelectedIndex(i);
							break;
						}
					}
				}
			}
		}
	}

}      